package com.eian.boot.common.id.model;

import com.eian.boot.common.id.enums.IdContentType;
import com.eian.boot.common.id.enums.IdTemplateType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 批量ID生成配置
 * 用于自定义批量生成ID的参数
 *
 * @author alex.meng
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BatchIdConfig {

    /**
     * 业务类型标识（用于号段/序列号生成时的标识）
     */
    private String bizType;

    /**
     * ID主体内容类型
     */
    @Builder.Default
    private IdContentType contentType = IdContentType.UUID;

    /**
     * 前缀模板类型
     */
    @Builder.Default
    private IdTemplateType prefixTemplate = IdTemplateType.FIXED;

    /**
     * 固定前缀值（当prefixTemplate为FIXED时使用）
     */
    private String prefix;

    /**
     * 后缀模板类型
     */
    @Builder.Default
    private IdTemplateType suffixTemplate = IdTemplateType.FIXED;

    /**
     * 固定后缀值（当suffixTemplate为FIXED时使用）
     */
    private String suffix;

    /**
     * 补位字符
     */
    @Builder.Default
    private Character padChar = '0';

    /**
     * ID总长度（不包括前后缀，0表示不补位）
     */
    @Builder.Default
    private Integer idLength = 0;

    /**
     * 补位位置
     */
    @Builder.Default
    private PadPosition padPosition = PadPosition.LEFT;

    /**
     * 是否使用混淆
     */
    @Builder.Default
    private Boolean useObfuscate = false;

    /**
     * 快速创建卡密配置（高安全性、不可预测）
     *
     * @param prefix 前缀
     * @param length ID长度
     * @return 配置对象
     */
    public static BatchIdConfig forCardKey(String prefix, int length) {
        return BatchIdConfig.builder()
                .contentType(IdContentType.UUID)
                .prefix(prefix)
                .idLength(length)
                .useObfuscate(true)
                .build();
    }

    /**
     * 快速创建优惠券配置（易读性、唯一性）
     *
     * @param prefix 前缀
     * @param length ID长度
     * @return 配置对象
     */
    public static BatchIdConfig forCoupon(String prefix, int length) {
        return BatchIdConfig.builder()
                .contentType(IdContentType.SNOWFLAKE)
                .prefix(prefix)
                .idLength(length)
                .padChar('0')
                .build();
    }

    /**
     * 快速创建兑换码配置（短小精悍）
     *
     * @param prefix 前缀
     * @return 配置对象
     */
    public static BatchIdConfig forRedeemCode(String prefix) {
        return BatchIdConfig.builder()
                .contentType(IdContentType.UUID)
                .prefix(prefix)
                .idLength(8)
                .useObfuscate(true)
                .build();
    }
}

